package com.yxw.yxnet_cd_center.common.enums;


import lombok.Getter;

/**
 * @desc: 短信发送错误信息
 * @author: liuxin
 * @date: 2023.0922
 */
public enum SMSErrEnum {


    /**
     * 成功标识
     */
    SUCCESS("000000", "发送请求成功", ""),
    /**
     * 短信发送：结果单条报错编码
     */
    E200015("E200015", "待发送短信数量太大", ""),
    E200028("E200028", "模板变量校验失败", ""),
    E200029("E200029", "模板类型校验失败", ""),
    E200030("E200030", "模板未激活", ""),
    E200031("E200031", "协议校验失败", ""),
    E200033("E200033", "模板类型不正确", ""),
    E200041("E200041", "同一短信内容接收号码重复", ""),

    /**
     * 短信发送：统一报错编码
     *
     * @param code
     * @param errMsg
     */
    E000000("E000000", "系统异常", "请先对照代码样例检查templateParas参数设置是否正确。若排查代码后仍未解决问题，请联系管理员处理"),
    E000001("E000001", "HTTP消息头未找到Authorization字段", "请检查HTTP消息头中是否携带了Authorization字段"),
    E000002("E000002", "Authorization字段中未找到realm属性", "请检查Authorization字段中的是否携带了realm属性"),
    E000003("E000003", "Authorization字段中未找到profile属性", "请检查Authorization字段中的是否携带了profile属性"),
    E000004("E000004", "Authorization中realm属性值应该为“SDP”", "请检查Authorization字段中的realm属性值是否为“SDP”"),
    E000005("E000005", "Authorization中profile属性值应该为“UsernameToken", "请检查Authorization字段中的profile属性值是否为“UsernameToken”"),
    E000006("E000006", "Authorization中type属性值应该为“Appkey”", "请检查Authorization字段中的type属性值是否为“Appkey”"),
    E000007("E000007", "Authorization字段中未找到type属性", "请检查Authorization字段中是否携带了type属性"),
    E000008("E000008", "Authorization中没有携带WSSE", "请检查Authorization字段中是否携带了WSSE"),
    E000020("E000020", "HTTP头未找到X-WSSE字段", "请检查HTTP消息头中是否携带了X-WSSE字段"),
    E000021("E000021", "X-WSSE字段中未找到UserName属性", "请检查X-WSSE字段中的是否携带了UserName属性"),
    E000022("E000022", "X-WSSE字段中未找到Nonce属性", "请检查X-WSSE字段中的是否携带了Nonce属性"),
    E000023("E000023", "X-WSSE字段中未找到Created属性", "请检查X-WSSE字段中的是否携带了Created属性"),
    E000024("E000024", "X-WSSE字段中未找到PasswordDigest属性", "请检查X-WSSE字段中的是否携带了PasswordDigest属性"),
    E000025("E000025", "Created属性格式错误", "请检查X-WSSE字段中的Created属性格式是否正确"),
    E000026("E000026", "X-WSSE字段中未找到UsernameToken属性", "请检查X-WSSE字段中的是否携带了UsernameToken属性"),
    E000027("E000027", "非法请求", "根据API接口文档的参数描述和要求，检查请求携带的参数是否都合法"),
    E000040("E000040", "ContentType值应该为application/x-www-form-urlencoded", "请检查ContentType头域的取值是否为“application/x-www-form-urlencoded”"),
    E000503("E000503", "参数格式错误", "请检查参数格式是否正确"),
    E000510("E000510", "短信发送失败，描述见参数status", "查看响应参数中的status确认发送失败的原因，修改后重新发送"),
    E000101("E000101", "鉴权失败", "请检查Authorization和X-WSSE参数的填写是否正确"),
    E000102("E000102", "app_key无效", "请检查请求携带的app_key填写是否正确。如app_key填写正确，建议检查app接入地址是否正确（从控制台“应用管理”获取"),
    E000103("E000103", "app_key不可用", "请联系管理员确认该app_key状态是否正常"),
    E000104("E000104", "app_secret无效", "请检查请求携带的app_secret填写是否正确"),
    E000105("E000105", "PasswordDigest无效", "请检查请求携带的PasswordDigest填写是否正确"),
    E000106("E000106", "app_key没有调用本API的权限", "请联系管理员确认该app_key是否具有“短信能力开放”能力"),
    E000109("E000109", "用户状态未激活", "请联系管理员激活用户"),
    E000110("E000110", "时间超出限制", "请确认X-WSSE鉴权时，生成随机数的时间与发送请求时的本地时间不能相差太大（具体差值请与管理员确认）"),
    E000111("E000111", "用户名或密码错误", "系统找不到app_key对应的用户信息，请联系管理员处理"),
    E000112("E000112", "用户状态已冻结", "若是因账户欠费冻结，请参考华为云账户充值完成充值，到账后自动解冻。若是因业务违规冻结，请整改业务后联系运营经理申请解冻"),
    E000620("E000620", "对端app IP不在白名单列表中", "IP白名单配置生效约有10~15分钟的时延，未及时生效可能导致该报错。\n" +
            "IP白名单配置不正确。请前往控制台“应用管理”点击“修改”应用，检查并修改自行配置的IP白名单，或重新添加正确的IP白名单（IP白名单为平台管理员配置时"),
    E000623("E000623", "SP短信发送量达到限额", "请联系运营经理协商调整SP短信发送量最大限额");


    private SMSErrEnum(String code, String errMsg, String dealMethod) {
        this.code = code;
        this.errMsg = errMsg;
        this.dealMethod = dealMethod;
    }

    /**
     * 根据编码获取错误信息
     *
     * @param code
     * @return
     */
    public static String getErrMsgByCode(String code) {
        for (SMSErrEnum err : SMSErrEnum.values()) {
            if (err.getCode().equals(code)) {
                return err.getErrMsg();
            }
        }
        return "问题描述未知";
    }

    /**
     * 根据编码获取处理方法
     *
     * @param code
     * @return
     */
    public static String getDealMethodByCode(String code) {
        for (SMSErrEnum err : SMSErrEnum.values()) {
            if (err.getCode().equals(code)) {
                return err.getDealMethod();
            }
        }
        return "处理方法未知";
    }

    /**
     * 编码类型
     */
    @Getter
    private String code;

    /**
     * 短信错误信息
     */
    @Getter
    private String errMsg;
    /**
     * 短信错误信息
     */
    @Getter
    private String dealMethod;
}
